package publicacion;

import static org.mockito.Mockito.mock;
import model.Publicacion.Pregunta;
import model.Publicacion.Respuesta;
import model.Usuario.UsuarioRegistrado;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class TestPregunta {
	
	Pregunta preguntaA;
	UsuarioRegistrado usuarioA;
	
	Respuesta respuestaA;
	Respuesta respuestaB;
	Respuesta respuestaC;
	Respuesta respuestaD;
	Respuesta respuestaE;
	
	@Before
	public void setUp(){
		usuarioA = mock (UsuarioRegistrado.class);
		preguntaA = new Pregunta("tituloA",usuarioA,"cuerpoA");
		
		respuestaA = mock(Respuesta.class);
		respuestaB = mock(Respuesta.class);
		respuestaC = mock(Respuesta.class);
		respuestaD = mock(Respuesta.class);
		respuestaE = mock(Respuesta.class);
	}
	
	@Test
	public void testAgregarRespuesta(){
		//Se testea que se agreguen las respuestas
		int cantidadEsperada = 0;
		preguntaA.agregarRespuesta(respuestaA);
		cantidadEsperada++;
		Assert.assertEquals(cantidadEsperada, preguntaA.getCantRespuestas());
		
		preguntaA.agregarRespuesta(respuestaB);
		cantidadEsperada++;
		Assert.assertEquals(cantidadEsperada, preguntaA.getCantRespuestas());
		
		preguntaA.agregarRespuesta(respuestaC);
		cantidadEsperada++;
		Assert.assertEquals(cantidadEsperada, preguntaA.getCantRespuestas());
		
		preguntaA.agregarRespuesta(respuestaD);
		cantidadEsperada++;
		Assert.assertEquals(cantidadEsperada, preguntaA.getCantRespuestas());
		
		preguntaA.agregarRespuesta(respuestaE);
		cantidadEsperada++;
		Assert.assertEquals(cantidadEsperada, preguntaA.getCantRespuestas());
		
		//Se testea que las 5 respuestas agregadas sean las que agregamos.
		Assert.assertEquals(respuestaA, preguntaA.getRespuestas().get(0));
		Assert.assertEquals(respuestaB, preguntaA.getRespuestas().get(1));
		Assert.assertEquals(respuestaC, preguntaA.getRespuestas().get(2));
		Assert.assertEquals(respuestaD, preguntaA.getRespuestas().get(3));
		Assert.assertEquals(respuestaE, preguntaA.getRespuestas().get(4));
	}
	
	@Test
	public void testAgregarEtiqueta(){
		//Se testea que se agreguen las etiquetas 
		int cantidadEsperada = 0;
		Assert.assertEquals(cantidadEsperada, preguntaA.getCantEtiquetas());
		
		preguntaA.agregarEtiqueta("etiqueta1");
		cantidadEsperada++;
		Assert.assertEquals(cantidadEsperada, preguntaA.getCantEtiquetas());
		
		preguntaA.agregarEtiqueta("etiqueta2");
		cantidadEsperada++;
		Assert.assertEquals(cantidadEsperada, preguntaA.getCantEtiquetas());
		
		preguntaA.agregarEtiqueta("etiqueta3");
		cantidadEsperada++;
		Assert.assertEquals(cantidadEsperada, preguntaA.getCantEtiquetas());
		
		preguntaA.agregarEtiqueta("etiqueta4");
		cantidadEsperada++;
		Assert.assertEquals(cantidadEsperada, preguntaA.getCantEtiquetas());
		
		//Se testea que las 4 etiquetas agregadas sean las que agregamos.
		Assert.assertEquals("etiqueta1", preguntaA.getEtiquetas().get(0));
		Assert.assertEquals("etiqueta2", preguntaA.getEtiquetas().get(1));
		Assert.assertEquals("etiqueta3", preguntaA.getEtiquetas().get(2));
		Assert.assertEquals("etiqueta4", preguntaA.getEtiquetas().get(3));
	}
	
	@Test
	public void testSacarEtiqueta(){
		//Se testea que se saquen las etiquetas 
		int cantidadEsperada = 4;	
		preguntaA.agregarEtiqueta("etiqueta1");
		preguntaA.agregarEtiqueta("etiqueta2");
		preguntaA.agregarEtiqueta("etiqueta3");
		preguntaA.agregarEtiqueta("etiqueta4");
		
		preguntaA.sacarEtiqueta("etiqueta4");
		cantidadEsperada--;
		Assert.assertEquals(cantidadEsperada, preguntaA.getCantEtiquetas());
		
		preguntaA.sacarEtiqueta("etiqueta3");
		cantidadEsperada--;
		Assert.assertEquals(cantidadEsperada, preguntaA.getCantEtiquetas());
	
		preguntaA.sacarEtiqueta("etiqueta2");
		cantidadEsperada--;
		Assert.assertEquals(cantidadEsperada, preguntaA.getCantEtiquetas());
	
		preguntaA.sacarEtiqueta("etiqueta1");
		cantidadEsperada--;
		Assert.assertEquals(cantidadEsperada, preguntaA.getCantEtiquetas());
	
	}
	
	@Test
	public void testSacarRespuesta(){
		int cantidadEsperada = 5;
		//Se agregan 5 respuestas a la pregunta preguntaA.
		preguntaA.agregarRespuesta(respuestaA);
		preguntaA.agregarRespuesta(respuestaB);
		preguntaA.agregarRespuesta(respuestaC);
		preguntaA.agregarRespuesta(respuestaD);
		preguntaA.agregarRespuesta(respuestaE);
		
		//Se sacan de a una a la vez y se testea que la cantidad se reduzca en uno cada vez.
		preguntaA.sacarRespuesta(respuestaE);
		cantidadEsperada--;
		Assert.assertEquals(cantidadEsperada, preguntaA.getCantRespuestas());
		
		preguntaA.sacarRespuesta(respuestaD);
		cantidadEsperada--;
		Assert.assertEquals(cantidadEsperada, preguntaA.getCantRespuestas());
		
		preguntaA.sacarRespuesta(respuestaC);
		cantidadEsperada--;
		Assert.assertEquals(cantidadEsperada, preguntaA.getCantRespuestas());
		
		preguntaA.sacarRespuesta(respuestaB);
		cantidadEsperada--;
		Assert.assertEquals(cantidadEsperada, preguntaA.getCantRespuestas());
		
		preguntaA.sacarRespuesta(respuestaA);
		cantidadEsperada--;
		Assert.assertEquals(cantidadEsperada, preguntaA.getCantRespuestas());
		
	}
	
	@Test
	public void testExistenEtiquetas(){
		//Creo una pregunta con 4 etiquetas.
		boolean existe   = true;
		boolean noExiste = false;

		preguntaA.agregarEtiqueta("etiqueta1");
		preguntaA.agregarEtiqueta("etiqueta2");
		preguntaA.agregarEtiqueta("etiqueta3");
		preguntaA.agregarEtiqueta("etiqueta4");

		Assert.assertEquals(existe, preguntaA.existeEtiqueta("etiqueta1"));
		Assert.assertEquals(existe, preguntaA.existeEtiqueta("etiqueta2"));
		Assert.assertEquals(existe, preguntaA.existeEtiqueta("etiqueta3"));
		Assert.assertEquals(existe, preguntaA.existeEtiqueta("etiqueta4"));

		//Le saco las 4 etiquetas
		preguntaA.sacarEtiqueta("etiqueta1");
		preguntaA.sacarEtiqueta("etiqueta2");
		preguntaA.sacarEtiqueta("etiqueta3");
		preguntaA.sacarEtiqueta("etiqueta4");
		
		Assert.assertEquals(noExiste, preguntaA.existeEtiqueta("etiqueta1"));
		Assert.assertEquals(noExiste, preguntaA.existeEtiqueta("etiqueta2"));
		Assert.assertEquals(noExiste, preguntaA.existeEtiqueta("etiqueta3"));
		Assert.assertEquals(noExiste, preguntaA.existeEtiqueta("etiqueta4"));
	}
	
	@Test
	public void testModificar(){
		Pregunta nuevaPregunta;
		UsuarioRegistrado usuario1;
		
		
		usuario1 = mock (UsuarioRegistrado.class);
		nuevaPregunta = new Pregunta("tituloEsperado",usuario1,"cuerpoEsperado");
		preguntaA.modificar(nuevaPregunta);
		
		Assert.assertEquals("tituloEsperado", preguntaA.getTitulo());
		Assert.assertEquals("cuerpoEsperado", preguntaA.getCuerpo());
		
	}
	
	@Test 
	public void testExisteRespuesta(){
		boolean existe = true;
		boolean noExiste = false;
		
		//Agrego 3 respuestas a la Pregunta preguntaA
		preguntaA.agregarRespuesta(respuestaA);
		preguntaA.agregarRespuesta(respuestaB);
		preguntaA.agregarRespuesta(respuestaC);
		
		Assert.assertEquals(existe,preguntaA.existeRespuesta(respuestaA));
		Assert.assertEquals(existe,preguntaA.existeRespuesta(respuestaB));
		Assert.assertEquals(existe,preguntaA.existeRespuesta(respuestaC));
		Assert.assertEquals(noExiste,preguntaA.existeRespuesta(respuestaD));
	}
	
	@Test
	public void testSetTitulo()
	{
		preguntaA.setTitulo("asd");
		Assert.assertEquals("asd", preguntaA.getTitulo());
	}
}
